(以下文章擷取自筆者的 blog,分享給大家)
這篇筆者會說明在使用 FederatedX Storage Engine 碰到的問題,除了這個以外,筆者想要說的是,MariaDB 的社群實力十分堅強,這個問題的解決方法也是社群大神幫忙的,不會有孤立無援的感覺。
在筆者上線實做這個方式的時候,碰到一個問題,不管怎麼調整都會失敗。
insert into federated_table select * from local_table ...;
-> insert into local_staged_table select * from local_table ...; insert into federated_table select * from local_staged_table;
)錯誤的訊息 Got error 10000 'Error on remote system: 2006: MySQL server has gone away' from FEDERATED
。
因為錯誤太多了,把方法修改成是備份還原的方法 mysqldump ... DB.table | mysql ... DB ...
,透過 sys_exec
執行(這個後面幾天會說明到),不再使用 FederatedX Storage Engine。
筆者也在社群發一個 issue,發現到之前也有一個類似的 issue (其實那篇裡頭就有解答,但筆者看不是很懂為什麼要那樣做)。
這個回答之前舊的問題的神人幫忙,終於解開疑惑了,他的解釋十分清楚,也不厭其煩的解釋每個動作。
原因在於遠端連線的問題。
基本上一個 Federated Table 的存取大概是這樣
動作 | 到遠端連線狀態 | 結果 |
---|---|---|
Create Server |
N/A | OK |
Create Table |
會測試連線是否正常,測試完即結束連線 | OK |
1st DMLs for Federate Table | 第一個動作會建起到遠端連線的 session,並做相關紀錄 | OK |
Other DMLs for Federate Table | 順利透過剛剛建立的 session 繼續作業 | OK |
遠端的 session 的 idle 時間大於 session wait_timeout 導致被 Kill 掉 遠端重開機或是一些緣故導致之前建立的 session 斷掉 |
N/A | N/A |
斷掉後的第一個 DMLs for Federate Table | N/A | 必定失敗(因為原來紀錄的 session 不見了) |
重做 DMLs for Federate Table 或是下一個 | 建起到遠端連線的 session,並做相關紀錄 | OK |
如果在預設的狀態下 (wait_timeout
時間為 28800 秒,等於 8 小時),兩次作業時間為 24 小時,自然會被 Kill 掉,下次作業就會發生錯誤。
神人提到的解法是修改 wait_timeout
的時間,但筆者覺得那個系統參數可能會因為效能的問題而改變,這樣在管理上有些麻煩,所以改採開另一個排程,每小時作一次 Query 來讓 timeout 時間重算,這樣就不會發生觸發 wait_timeout
導致排程發生失敗的問題了。